package com.hwua.daoimpl;

import com.hwua.dao.ResultSetHandler;
import com.hwua.dao.UserDao;
import com.hwua.domain.User;
import com.hwua.exception.IllegalSqlException;
import com.hwua.util.CheckStringTools;
import com.hwua.util.ConnectionTools;
import com.hwua.util.TableInformationTools;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 对用户增删改差的实现类
 * @author Administrator
 */
public class UserDaoImpl implements UserDao {
    private volatile Connection connection;

    public UserDaoImpl(Connection connection) {
        this.connection = connection;
    }

    /**
     * 对用户信息进行增删改的方法
     * @param sql 传入的sql语句
     * @param params sql里的参数
     * @return
     */
    @Override
    public int update(String sql, Object... params) throws IllegalSqlException, SQLException {
        //检查参数是否存在
        if(CheckStringTools.checkString(sql)){
            throw new IllegalSqlException();
        }
        //获取连接工具对象
        ConnectionTools ct = ConnectionTools.GetConnection.INSTANCE.getInstance();
        //通过连接获取预处理对象，并且将要执行的sql语句放入
        PreparedStatement statement = connection.prepareStatement(sql);
        //获取占位符数量
        int parameterCount = statement.getParameterMetaData().getParameterCount();
        //循环给占位符赋值
        for (int i = 0; i < parameterCount; i++) {
            statement.setObject(i+1,params[i]);
        }
        //执行sql语句,获取受sql语句影响的行数
        int i = statement.executeUpdate();
        //关闭预处理
        ct.closePreparedStatement(statement);
        return i;
    }
    /**
     * 查找的方法
     * @param sql
     * @param params
     * @return
     */
    @Override
    public List<User> query(String sql, ResultSetHandler<User> handler, Object... params) throws IllegalSqlException, SQLException {
        //检查参数sql语句
        if(CheckStringTools.checkString(sql)){
            throw new IllegalSqlException();
        }
        //获取连接工具对象
        ConnectionTools ct = ConnectionTools.GetConnection.INSTANCE.getInstance();
        //通过连接获取预处理对象，并传入sql语句
        PreparedStatement statement = connection.prepareStatement(sql);
        //获取占位符数量
        int parameterCount = statement.getParameterMetaData().getParameterCount();
        //循环给占位符赋值
        for (int i = 0; i < parameterCount; i++) {
            statement.setObject(i+1,params[i]);
        }
        //执行sql语句，返回结果集
        ResultSet rSet = statement.executeQuery();
        //将结果集加入管理者
        List<User> userList = handler.getResult(rSet);
        //关闭结果集
        ct.closeResultSet(rSet);
        //关闭预处理
        ct.closePreparedStatement(statement);
        //返回查询到的集合
        return userList;
    }
}
